// 监听引擎。为用户提供方便、智能的监听 

function NW04_jt_cm(fq) {
    this.fq = fq;
    //默认节点id
    this.mrJD = fq.mrJD;
    // 鼠标事件-纯方法名。
    this.jp = /^_0403_cm_(ks|yd|js){1}$/i
    this.jpHzj = /^_0403_cm_(ks|yd|js)_[0-9a-z_]+$/i
    //监听【类型列表】
    this.lxLB = ['cm_ks', 'cm_yd', 'cm_js']
    //方法前缀
    this.ffqz = [
        '_0403_cm_ks',
        '_0403_cm_yd',
        '_0403_cm_js'
    ]
}

NW04_jt_cm.prototype.tjRW = function (dx) {
    let _jt_id;
    let _mrjd = dx[this.mrJD];
    for (let ffm in dx) {

        //如果方法是 监听 要调用的方法（纯方法。没有配置节点id在里面）
        if (this.jp.test(ffm)) {
            _jt_id = dx[ffm + 'zj'];//方法监听 节点的id值
            //判断此方法的要监听的 节点
            if (!_jt_id) {//如果不存在这个属性，表示用户没有配置专门的节点id。检测是否配置了默认节点id，如果没有配置，表明这不是监听方法。
                if (!_mrjd) {//没有配置默认节点
                    continue;//下一个方法。这个方法不是监听方法。
                }
                _jt_id = _mrjd;
            }
            //找齐了一个配置。监听节点id、 方法名、对象、方法归属哪种监听；将分析结束，放入到父容器中保存（以监听任务形式）
            this.fq.tjRWdx(_jt_id, ffm, dx, this.hqLX(ffm));//添加【监听作业】。
            continue;
        }
        //如果 方法是由 
        // /^_0403_cm_(ks|yd|js)_[0-9a-z_]+$/i 组成：
        if (this.jpHzj.test(ffm)) {
            this.fq.tjRWdx(this.hqZJ(ffm), ffm, dx, this.hqLX(ffm));
        }
    }
}
//从方法名，分析出 本方法要绑定在 哪种事件。 比如：单击、右右......

NW04_jt_cm.prototype.hqLX = function (ffm) {
    ffm = ffm.toLowerCase();//转成小写，方法比较、查找。
    for (let i = 0; i < this.lxLB.length; i++) {
        // 因为方法名前缀，都是 _0403_ 所以，['cm_ks', 'cm_yd', 'cm_js']必须从6位开始
        if (ffm.indexOf(this.lxLB[i]) == 6) {
            return this.lxLB[i];
        }
    }
}

//从方法名中，提供id.
NW04_jt_cm.prototype.hqZJ = function (ffm) {
    let _ffm = ffm.toLowerCase();//转成小写，方法比较、查找。
    let _qj;
    for (let i = 0; i < this.ffqz.length; i++) {
        _qj = this.ffqz[i];
        if (_ffm.startsWith(_qj)) {//如果方法名以 _0403_cm_(ks|yd|js) 开始
            return ffm.substring(_qj.length + 1);
        }
    }
}


